package com.jianbing.redisdemo;

/**
 * @ClassName : HandlerLock
 * @Description :
 * @Author : JB
 * @Date: 2020-11-29 17:38
 */


import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;


import java.util.concurrent.TimeUnit;

/*
 * 利用RedissonClient部署及解除分布式锁
 * 直接调用lock、unlock方法，此方法只允许1个线程取得锁，其余线程将自旋等待
 * */

@Repository
public class HandlerLock{
    @Autowired
    private RedisTemplate<String,String> rt;
    //@Qualifier("redisson") //在org.redisson.spring.starter包中，可以从配置文件读取redis配置，并返回redissonclient对象
   //@Qualifier("getRedissionClient")//指定从本地自写的class中取得实例
    @Autowired
    private RedissonClient redissonClient;
    //实验方法，测试分布式锁
    public void doLock(String lockname){
        //从RedissonClient取得Rlock实例
        RLock rlock=redissonClient.getLock(lockname);
        //尝试取锁，有效期为3s，到期后自动释放。如果取得锁继续执行。取锁失败则自旋。
        //亦可使用rlock.tryLock（）方法，此方法也为尝试取锁，并返回boolean结果
        rlock.lock(3,TimeUnit.SECONDS);
        //以下为测试业务代码，
        System.out.println(Thread.currentThread().getName()+"取得锁");
        int store=Integer.valueOf(rt.opsForValue().get("store"));
        if(store>0)
        {
           // int i = 1/0;
            System.out.printf("售出1,当前库存为%d\n",--store);
            rt.opsForValue().set("store",String.valueOf(store));
        }else
            System.out.println("已售完，下次再来吧");
        //业务完成，释放锁
        rlock.unlock();
        System.out.println("解锁");
    }
}